/**
 *   Wechaty Chatbot SDK - https://github.com/wechaty/wechaty
 *
 *   @copyright 2016 Huan LI (李卓桓) <https://github.com/huan>, and
 *                   Wechaty Contributors <https://github.com/wechaty>.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
import {
  WechatyBuilder,
  ScanStatus,
  Message,
  Contact,
  globalParameters,
}                     from '../src/mods/mod.js' // from 'wechaty'

// import qrTerm from 'qrcode-terminal'
// import { FileBox } from 'file-box'
import mysql from 'mysql2';
import axios from 'axios';
import { parseString } from "xml2js";


/**
 *
 * 1. Declare your Bot!
 *
 */
const options = {
  name : 'ding-dong-bot',
/*  puppet: 'wechaty-puppet-padlocal',
  puppetOptions: {
    token: 'puppet_padlocal_83d2e760087f42099790f0187e64c4ae',
  }*/
}

// @ts-ignore
const bot = WechatyBuilder.build(options)

/**
 *
 * 2. Register event handlers for Bot
 *
 */
bot
  .on('logout', onLogout)
  .on('login',  onLogin)
  .on('scan',   onScan)
  .on('error',  onError)
  .on('message', onMessage)
/**
 *
 * 3. Start the bot!
 *
 */
  .start()
  .catch(async e => {
    console.error('Bot start() fail:', e)
    await bot.stop()
    process.exit(-1)
  })

/**
 *
 * 4. You are all set. ;-]
 *
 */

/**
 *
 * 5. Define Event Handler Functions for:
 *  `scan`, `login`, `logout`, `error`, and `message`
 *
 */
function onScan (qrcode: string, status: ScanStatus) {
  if (status === ScanStatus.Waiting || status === ScanStatus.Timeout) {
    // qrTerm.generate(qrcode)

    const qrcodeImageUrl = [
      'https://wechaty.js.org/qrcode/',
      encodeURIComponent(qrcode),
    ].join('')

    console.info('onScan: %s(%s) - %s', ScanStatus[status], status, qrcodeImageUrl)
  } else {
    console.info('onScan: %s(%s)', ScanStatus[status], status)
  }

  // console.info(`[${ScanStatus[status]}(${status})] ${qrcodeImageUrl}\nScan QR Code above to log in: `)
}

function onLogin (user: Contact) {
  console.info(`${user.name()} login`)
}

function onLogout (user: Contact) {
  console.info(`${user.name()} logged out`)
}

function onError (e: Error) {
  console.error('Bot error:', e)
  /*
  if (bot.isLoggedIn) {
    bot.say('Wechaty error: ' + e.message).catch(console.error)
  }
  */
}

// 创建数据库连接
const connection = mysql.createConnection({
  host: globalParameters.host,
  port: globalParameters.port,
  user: globalParameters.user,
  password: globalParameters.password,
  database: globalParameters.database
});

// 连接到数据库
connection.connect((err) => {
  if (err) {
    console.error('无法连接到数据库:', err);
    return;
  }
  console.log('已成功连接到数据库');
});

// 执行查询
async function query() {
  return new Promise((resolve, reject) => {
    connection.query('select id,yj_content from yj_weather_linan_postwarning_info where send = \'0\' order by yj_ptime',
      (err, results) => {
        if (err) {
          console.error('查询错误:', err);
          reject(err);
        } else {
          resolve(results);
        }
      }
    );
  });
}

// 定义要调用的接口函数
// @ts-ignore
async function sendMsg() {
  try {
    const results = await query();
    if (Array.isArray(results) && results.length > 0) {
      const keyRoom = await bot.Room.find({topic: globalParameters.wechatGroup});
      for (const result of results) {
        // 处理每个结果对象
        if (keyRoom) {
          keyRoom.say(result.yj_content);
          console.log(result.id+'发送成功');
          await updateData(result.id);
        } else {
          console.error('找不到'+globalParameters.wechatGroup);
        }
      }
    }
  } catch (error) {
    console.error('查询错误:', error);
  }
}

function executeUpdateQuery(query: string) {
  return new Promise((resolve, reject) => {
    connection.query(query, (err, result) => {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  });
}

async function updateData(id: string) {
  try {
    const query = "update yj_weather_linan_postwarning_info set send = '1' where id = "+id;
    const result = await executeUpdateQuery(query);
    console.log("更新成功:", result);
  } catch (error) {
    console.error("更新错误:", error);
  }
}




async function onMessage (msg: Message) {
  // @ts-ignore
  if (msg.talker().name() === '物联网报警主机') {

    const text = msg.text();
    // console.log('物联网报警主机:', text);
    // console.log("");
    let title = '';
    let des = '';
    let powerOffTime = '';
    let deviceName = '';
    let electricity = '';
    parseString(text, (error, result) => {
      if (error) {
        console.error("Error parsing XML: " + error);
        return;
      }

      const appmsg = result.msg.appmsg[0];
      title = appmsg.title[0];
      des = appmsg.des[0];
    });
    console.log("title:",title);
    if(title == '设备断电通知' || title == '设备告警通知'){
      if(title == '设备断电通知'){
        electricity = '0';
        const deviceNameMatch = des.match(/设备名称：(.+)/);
        const powerOffTimeMatch = des.match(/断电时间：(.+)/);
        if (deviceNameMatch && powerOffTimeMatch) {
          deviceName = deviceNameMatch[1]?.trim() as string;
          powerOffTime = powerOffTimeMatch[1]?.trim() as string;
        }
      }else if(title == '设备告警通知'){
        electricity = '1';
        const deviceNameMatch = des.match(/设备名称：(.+)/);
        const alarmTimeMatch = des.match(/告警时间：(.+)/);
        if ( deviceNameMatch && alarmTimeMatch ) {
          deviceName = deviceNameMatch[1]?.trim() as string;
          powerOffTime = alarmTimeMatch[1]?.trim() as string;
        }
      }
      const data = { "deviceName":deviceName,"pushTime": powerOffTime,"electricity":electricity};
      try {
        console.log('axiosPostData:', data);
        const response = await axios.post('http://ecs.linancity.com:12889/iotpush/setIOTPushData', data);
        const javaApiResponse = response.data;

        console.info('Java API response:', javaApiResponse);
      } catch (error) {
        console.error('Error calling Java API:', error);
      }
    }


    return
  }
  /*if (msg.self()) {
    console.info('Message discarded because its outgoing')
    return
  }

  if (msg.age() > 2 * 60) {
    console.info('Message discarded because its TOO OLD(than 2 minutes)')
    return
  }

  if (msg.type() !== bot.Message.Type.Text
    || !/^(ding|ping|bing|code)$/i.test(msg.text())
  ) {
    console.info('Message discarded because it does not match ding/ping/bing/code')
    return
  }

  /!**
   * 1. reply 'dong'
   *!/
  await msg.say('dong')
  console.info('REPLY: dong')

  /!**
   * 2. reply image(qrcode image)
   *!/
  const fileBox = FileBox.fromUrl('https://wechaty.github.io/wechaty/images/bot-qr-code.png')

  await msg.say(fileBox)
  console.info('REPLY: %s', fileBox.toString())

  /!**
   * 3. reply 'scan now!'
   *!/
  await msg.say([
    'Join Wechaty Developers Community\n\n',
    'Scan now, because other Wechaty developers want to talk with you too!\n\n',
    '(secret code: wechaty)',
  ].join(''))*/
}

/**
 *
 * 7. Output the Welcome Message
 *
 */
const welcome = `
| __        __        _           _
| \\ \\      / /__  ___| |__   __ _| |_ _   _
|  \\ \\ /\\ / / _ \\/ __| '_ \\ / _\` | __| | | |
|   \\ V  V /  __/ (__| | | | (_| | |_| |_| |
|    \\_/\\_/ \\___|\\___|_| |_|\\__,_|\\__|\\__, |
|                                     |___/

=============== Powered by Wechaty ===============
-------- https://github.com/wechaty/wechaty --------
          Version: ${bot.version()}
__________________________________________________

Hope you like it, and you are very welcome to
upgrade me to more superpowers!

Please wait... I'm trying to login in...

`
console.info(welcome)
// @ts-ignore
async function sendMsgTest() {
  const currentDate = new Date();
  const year = currentDate.getFullYear();
  const month = currentDate.getMonth() + 1; // 月份从 0 开始，因此需要加 1
  const day = currentDate.getDate();
  const hours = currentDate.getHours();
  const minutes = currentDate.getMinutes();
  const seconds = currentDate.getSeconds();
  let s = year+'-'+month+'-'+day+' '+hours+':'+minutes+':'+seconds;
  const keyRoom = await bot.Room.find({topic: '消息通知群'});
  if (keyRoom) {
    keyRoom.say('当前时间：'+s);
  }
}

// 创建一个定时任务，每隔一定时间调用一次接口
// @ts-ignore
const interval = globalParameters.interval*1000; // 间隔时间为5秒
// setInterval(sendMsg, interval);
// setInterval(sendMsgTest, interval);

